package com.un.ebs.product.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.un.ebs.core.power.PowerResourcManager;
import com.un.ebs.product.domain.Product;
import com.un.ebs.product.domain.ProductExt;
import com.un.ebs.product.domain.ProductOrderCommentExt;
import com.un.ebs.product.domain.ProductSkuExt;
import com.un.ebs.product.dto.*;
import com.un.ebs.sys.dto.ObjectParentAndIndexChangeDto;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author liubo
 * @since 2019-09-16
 */
public interface ProductService extends PowerResourcManager {

    /**
     * 创建SPU
     *
     * @param req
     */
    String add(ProductDto req);

    String add(ProductDto req, boolean isNotRepeat);

    /**
     * 批量创建SPU
     *
     * @param req
     */
    List<String> add(List<ProductDto> req);

    /**
     * 批量创建Spu
     *
     * @param req
     * @param isNotRepeat 是否允许 code 重复
     */
    List<String> add(List<ProductDto> req, boolean isNotRepeat);

    /**
     * 为SPU下的所有SKU指定 skuItem
     *
     * @param spuId        SPU ID
     * @param includeSkuId 子商品的SKuID
     * @param qty          子商品使用量
     */
    void addInclude(String spuId, String includeSkuId, Double qty);

    /**
     * 清除SPU下所有SKU的子SKU
     *
     * @param spuId
     */
    void clearInclude(String spuId);

    /**
     * 修改SPU，如果修改了销售属性，则重新生成SKU
     *
     * @param req
     */
    void update(ProductDto req);

    /**
     * 批量修改SPU
     *
     * @param req
     */
    void updateBatch(ProductBatchUpdateDto req);

    /**
     * 删除SPU
     *
     * @param id
     */
    void delete(String id);

    void unDelete(String id);

    /**
     * 重新生成指定SPU 的 SKU
     *
     * @param productId
     */
    int updateSku(String productId);

    /**
     * 设置SPU的质检比例
     *
     * @param productId     SPU ID
     * @param purchasePro   采购入库检比例
     * @param salePro       销售出库检比例
     * @param productionPro 生产入库检
     * @return
     */
    int updateQualityProportion(String productId, Double purchasePro, Double salePro, Double productionPro);

    /**
     * 上架销售
     *
     * @param id
     */
    void upperShelf(String id);

    /**
     * 下架，不再销售
     *
     * @param id
     */
    void lowerShelf(String id);

    /**
     * 排序
     *
     * @param req
     */
    void changeSort(List<ObjectParentAndIndexChangeDto> req);

    /**
     * 查询商品详情，包含结构化的属性集合
     *
     * @param id
     * @return
     */
    ProductVo queryViewById(String id);

    /**
     * 根据SPU Code 查询所有SKU
     *
     * @param id
     * @return
     */
    List<ProductSkuExt> querySkuByCode(String id);

    List<ProductSkuExt> querySkuById(String spuId);

    Product queryByCode(String spuCode);

    /**
     * 查询商品详情，只包含基本属性
     *
     * @param id
     * @return
     */
    ProductExt queryById(String id);

    /**
     * 商品查询
     *
     * @param classId
     * @param searchText
     * @param onlyCanSale
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<ProductExt> query(String classId, String searchText, Boolean onlyCanSale, int pageSize, int pageIndex);

    IPage<ProductExt> queryBySaleClass(ProductQueryBySaleClassRequest req);

    /**
     * 查询可预约项目
     *
     * @return
     */
    List<ProductCanBookSpuDto> queryCanBook();

    /**
     * 获取类别下的查询属性
     *
     * @param classId
     * @return
     */
    List<ProductQueryAttrResponse> queryQueryAttr(String classId);

    /**
     * 获取类别下的动态列属性
     *
     * @param classId
     * @return
     */
    List<ProductQueryAttrResponse> queryColumnAttr(String classId);

    /**
     * 商品查询，可按关键属性查询
     *
     * @param req
     * @return
     */
    IPage<ProductExt> query(ProductQueryRequest req);

    /**
     * 根据SPUID，查询所有购买记录
     *
     * @param productId
     * @return
     */
    List<ProductOrderRecDto> queryOrderRec(String productId);

    /**
     * 根据SPU查询所有购买记录
     *
     * @param productId
     * @param pageIndex
     * @param pageSize
     * @return
     */
    IPage<ProductOrderRecDto> queryOrderRec(String productId, Integer pageIndex, Integer pageSize);

    IPage<ProductOrderCommentExt> queryComment(String productId, int pageIndex, int pageSize);

    IPage<ProductExt> queryDeleted(String code, int pageSize, int pageIndex);
}
